package com.zzyl.nursing.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONObject;
import com.zzyl.common.exception.base.BaseException;
import com.zzyl.nursing.service.WechatService;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.HashMap;
import java.util.Map;
@Service
public class WechatServiceImpl implements WechatService {
    //获取OpenID
    //https://api.weixin.qq.com/sns/jscode2session是请求路径地址
    public static final String URL_OPENID="https://api.weixin.qq.com/sns/jscode2session";

    //获取AccessToken地址 请求路径地址
    public static final String URL_ACCESSTOKEN="https://api.weixin.qq.com/cgi-bin/token";
    //获取手机号地址
    public static final String URL_PHONE="https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";


    @Override
    public String getOpenId(String code) {
        //1、封装请求参数
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("appid","wx16c8d60eca7cd2d4");
        dataMap.put("secret","470598176d916b2c20be8ae0825a2b34");
        //前端传进的
        dataMap.put("js_code",code);
        //固定
        dataMap.put("grant_type","authorization_code");
        //2、使用HutooL的HttpUtil发送Get请求 得到的结果是string("errcode":0,"errmsg":"ok")
        String result = HttpUtil.get(URL_OPENID,dataMap);
        //3、获取响应结果，并解析结果, 转成Map
        JSONObject jsonObject = JSONUtil.toBean(result,JSONObject.class);

//        //3.1 从JSON 对象中获取键为"errcode"的字段值，并将其转换为Integer类型
//        Integer errcode = jsonObject.getInteger("errcode");
//        if (errcode!=0){
//            throw new BaseException("获取openID异常");
//        }
//        //从jsonObject中获取键为openid,获取其值并转为字符串,返回
//
//        return jsonObject.getString("openid");
//    }


        String openId = jsonObject.getString("openid");
        if (ObjectUtil.isEmpty(openId)){
            throw new BaseException("获取openID异常");
        }
      return openId ;
    }









    //3.获取手机号
    @Override
    public String getPhone(String code) {
        //1、定义参数
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("code",code);

        //2、执行POST请求
        //URL_PHONE +getAccesstoken是拼接地址,getAccesstoken()是一个方法，用于获取访问令牌（access_token）
        HttpResponse response = HttpUtil.createPost(URL_PHONE +getAccesstoken())
                .body(JSONUtil.toJsonStr(dataMap),"application/json;charset=utf-8")
                .execute();
        //3、解析数据，获取响应体的内容，并将其存储为字符串,此时result是一个包含手机号信息的 JSON 字符串
        String result = response.body();
        JSONObject jsonObject = JSONUtil.toBean(result,JSONObject.class);
        if (jsonObject.getInteger("errcode")!=0){
            throw new BaseException("获取手机号失败");
        }
//        getByPath方法直接获取嵌套在phone_info对象中的purePhoneNumber字段值（即手机号）
        Object phone = jsonObject.getByPath("phone_info.purePhoneNumber");
        //通过 jsonObject.getByPath获取的 phone 是 Object 类型。
        //为了满足方法返回类型的要求，必须将 Object 类型转换为 String 类型
        return phone.toString();



    }




    //2获取accessToken
    public String getAccesstoken(){
        //1、定义参数
        Map<String, Object>  dataMap = new HashMap<>();
        dataMap.put("appid","wx16c8d60eca7cd2d4");
        dataMap.put("secret","470598176d916b2c20be8ae0825a2b34");
        //固定参数
        dataMap.put("grant_type","client_credential");

        //2、执行GET请求
        String result = HttpUtil.get(URL_ACCESSTOKEN, dataMap);


        //3、解析数据,转为map
        JSONObject jsonObject = JSONUtil.toBean(result,JSONObject.class);
        //将map转为字符串
        String accessTokenn = jsonObject.getString("access_token");
        //为空就返回
        if (ObjectUtil.isEmpty(accessTokenn)){
            throw new BaseException("获取AccessToken失败");
        }
        return accessTokenn;
    }







}
